﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class 玩家控制 : MonoBehaviour
{
    public List<GameObject> m_小球列表 = new List<GameObject>();
    public Queue<Vector3> m_历史位置 = new Queue<Vector3>();
    public float 拖尾比例 = 0;
    public GameObject m_头部;
    public GameObject m_主摄像机; 
    public 玩家点 m_玩家小段预制;
    public int m_得分 = 0;
    public float m_当前速度倍率 = 1f;
    public float m_恒定速度倍率 = 1f;
    public Vector2 m_上次触摸位置;

    public int m_最新奖励 = 0;
    public bool 失败 = false;

    public float m_碰撞冷却时间 = 0f;

    public ParticleSystem m_方块碎裂特效;
    public ParticleSystem m_小球碎裂特效;
    public AudioSource m_方块碎裂音效;
    public AudioSource m_小球碎裂音效;
    public List<AudioSource>  m_接东西音效;

    public AudioSource m_飞行音效;
    public AudioSource m_跳跃弹起音效;

    public AudioSource m_背景音乐;
    public Light m_光源;

    public 障碍方块 m_致死方块;

    void Start ()
    {
        // Firebase.Analytics.FirebaseAnalytics.SetAnalyticsCollectionEnabled(true);

        //RigidbodyConstraints.FreezePositionY |
        m_头部.GetComponent<Rigidbody>().constraints =  RigidbodyConstraints.FreezeRotation;
        //foreach(var v in m_小球列表)
        //{
        //    m_历史位置.Enqueue(m_头部.transform.position);
        //}

        for (int i = 0;i< m_小球列表.Count; i++)
        {
            m_历史位置.Enqueue(m_头部.transform.position);
        }

        m_飞行音效.volume = 0.3f;


    }

    private void FixedUpdate ()
    {
        if (m_最新奖励 > 0)
        {
            继续游戏(m_最新奖励);
            m_最新奖励 = 0;
        }

        if(!失败)
        {

           // Time.timeScale = 0.3f;
            if (m_当前速度倍率 < m_恒定速度倍率)
            {
                m_当前速度倍率 += 0.01f*Time.deltaTime;
                if(m_当前速度倍率>= m_恒定速度倍率)
                {
                    m_当前速度倍率 = m_恒定速度倍率;
                }
            }

            if (m_当前速度倍率 > m_恒定速度倍率)
            {
                m_当前速度倍率 -= 0.01f * Time.deltaTime;
                if (m_当前速度倍率 <= m_恒定速度倍率)
                {
                    m_当前速度倍率 = m_恒定速度倍率;
                }
            }




            
            if (连击屏幕次数 >= 2)
            {
                Debug.Log("连击屏幕次数" + 连击屏幕次数 );
                if(m_头部.transform.position.y < 1.2)
                {
                    var tmp = Instantiate(m_跳跃弹起音效);
                    DestroyObject(tmp, 3);
                    m_头部.GetComponent<Rigidbody>().AddForce(0, 17f, 0, ForceMode.VelocityChange);
                }
                连击屏幕次数 = 0;
            }
            if (m_头部.transform.position.y < 1)
                m_头部.transform.position = new Vector3(m_头部.transform.position.x, 1f, m_头部.transform.position.z);
            if (m_头部.transform.position.x < -4.80)
                m_头部.transform.position = new Vector3(-3.498f, m_头部.transform.position.y, m_头部.transform.position.z);
            if (m_头部.transform.position.x > 2.75)
                m_头部.transform.position = new Vector3(1.612f, m_头部.transform.position.y, m_头部.transform.position.z);


            if (m_历史位置.Count > 0)
            {

                //Vector3 上一个球的位置 = m_头部.transform.position;
                //int 上一个历史坐标序号 = m_历史位置.Count-1;

                //for (int i = 0; i < m_小球列表.Count; i++)
                //{
                //    //var tmpPos = m_历史位置.ToArray().First(p => Vector3.Distance(p, 上一个球的位置) >= 0.2f);
                //    for(int k = 上一个历史坐标序号-1;k>=0;k--)
                //    {
                //        if(Vector3.Distance(m_历史位置.ToArray()[k], 上一个球的位置) >= 0.0f)
                //        {
                //            上一个球的位置 = m_历史位置.ToArray()[k];
                //            m_小球列表[i].transform.position = m_历史位置.ToArray()[k];
                //            上一个历史坐标序号 = k;
                //            break;
                //        }
                //    }
                //      // + new Vector3(0, 0,(m_小球列表.Count- i)*(-0.1f + 拖尾比例));
                //}

                m_头部.GetComponent<Rigidbody>().AddForce(0, 0, Mathf.Lerp(25f,55f, 地图管理器.m_当前地图管理器.m_玩家当前所在行 / 250f) * m_当前速度倍率*Time.deltaTime, ForceMode.VelocityChange);
                m_历史位置.Dequeue();
                m_历史位置.Enqueue(m_头部.transform.position);
                //if (m_碰撞冷却时间<=0)
                //{
                //    m_头部.GetComponent<Rigidbody>().AddForce(0, 0, Mathf.Lerp(0.5f, 1f, 地图管理器.m_当前地图管理器.m_玩家当前所在行 / 200f) * m_当前速度倍率, ForceMode.VelocityChange);

                //}
                //else
                //{
                //    m_碰撞冷却时间 -= Time.deltaTime;
                //}

                //Debug.Log(this.GetComponent<Rigidbody>().velocity.x);

                for (int i = 0; i < m_小球列表.Count; i++)
                {
                    m_小球列表[m_小球列表.Count - 1 - i].transform.position = m_历史位置.ToArray()[i];  // + new Vector3(0, 0,(m_小球列表.Count- i)*(-0.1f + 拖尾比例));
                }
            }

            if(地图管理器.m_当前地图管理器.m_玩家当前所在行 >= 地图管理器.m_游戏最大行数)
            {
                m_光源.intensity -= 0.3f * Time.deltaTime;
            }
            else { m_光源.intensity = 1; }

            if ( 地图管理器.m_当前地图管理器.m_玩家当前所在行 >= 地图管理器.m_游戏最大行数 + 14 )
            {
                结束游戏(null);
                //Firebase.Analytics.FirebaseAnalytics.LogEvent("Game_Event", "Finished_Game", 1.0f);
            }
        }

        控制音量();
    }

    void Update ()
    {
        地图管理器.m_当前地图管理器.刷新地图(m_头部.transform.position.z);

        m_主摄像机.transform.position = new Vector3(m_主摄像机.transform.position.x, m_主摄像机.transform.position.y, m_头部.transform.position.z - 2.5f);

    }

    void OnFingerDown(FingerDownEvent e)
    {
        m_上次触摸位置 = e.Position;
        float 触击屏幕的时间 = Time.realtimeSinceStartup;
        if (触击屏幕的时间 - 上次手指离开屏幕时间 > 0.2) 连击屏幕次数 = 0;
    }

    private int 连击屏幕次数 = 0;
    private float 上次手指离开屏幕时间 = 0;
    void OnFingerUp(FingerUpEvent e)
    {

        // The finger object contains useful information not available through the event arguments that you might want to use
        FingerGestures.Finger finger = e.Finger;
        Debug.Log("OnFingerUp" + e.TimeHeldDown + " seconds" + Time.realtimeSinceStartup);
        if (e.TimeHeldDown <= 0.2) 连击屏幕次数++;
        else 连击屏幕次数 = 1;
        上次手指离开屏幕时间 = Time.realtimeSinceStartup;
    }

    void OnFingerMove(FingerMotionEvent e)
    {
        if(!失败)
        {
            m_头部.GetComponent<Rigidbody>().AddForce(new Vector3((e.Position.x - m_上次触摸位置.x) * 50, 0, 0));

            m_飞行音效.pitch = Mathf.Abs( (e.Position.x - m_上次触摸位置.x)) / 50f + 1f;
        }

        m_上次触摸位置 = e.Position;
    }

    public void 丢失一个()
    {
        //if (m_小球列表.Count <= 0)
        //{
        //    结束游戏();
        //}
        //else
        //{
        if (m_小球列表.Count > 0)
        {
            m_历史位置.Dequeue();
            var tmp = Instantiate(m_小球碎裂特效, m_头部.transform.position, m_头部.transform.rotation);
            DestroyObject(tmp, 3);
            var tmpa = Instantiate(m_小球碎裂音效);

            DestroyObject(tmpa, 3);

            DestroyObject(m_头部);
            m_头部 = m_小球列表[0];
            m_小球列表.RemoveAt(0);
            //RigidbodyConstraints.FreezePositionY |
            m_头部.GetComponent<Rigidbody>().constraints = RigidbodyConstraints.FreezeRotation;
            m_头部.GetComponent<Rigidbody>().isKinematic = false;
        }
        //}


    }

    public void 结束游戏( 障碍方块 结束游戏致死方块)
    {
        //Firebase.Analytics.FirebaseAnalytics.LogEvent("Game_Event", "GameOver_Percent", (地图管理器.m_当前地图管理器.m_玩家当前所在行/地图管理器.m_游戏最大行数)/1.0f);

        if (结束游戏致死方块 !=null )
        {
            m_致死方块 = 结束游戏致死方块;
        }
        失败 = true;
        if (m_得分 > 游戏全局.m_最高分)
        {
            游戏全局.m_最高分 = m_得分;
        }

        地图管理器.m_当前地图管理器.m_续命按钮.SetActive(  (地图管理器.m_当前地图管理器.m_玩家当前所在行 < 地图管理器.m_游戏最大行数)
                                                        && 广告集成.ad_视频广告.IsLoaded());

        地图管理器.m_当前地图管理器.m_统计面板.SetActive(true);
        int 随机出现广告 = Random.Range(0, 10);
        switch (随机出现广告)
        {
            case 0:
                广告集成.m_当前广告集成.显示全屏广告();
                break;
            case 1:

                if (广告集成.ad_视频广告.IsLoaded())
                {
                    地图管理器.m_当前地图管理器.m_续命按钮.SetActive(false);
                    广告集成.视频广告_是否执行回调 = false;
                    广告集成.显示视频广告();
                }
                break;
            default:
                广告集成.m_当前广告集成.显示底部广告();
                break;
        }
    }

    public void 显示视频广告()
    {
        if (广告集成.ad_视频广告.IsLoaded())
        {
            广告集成.视频广告_是否执行回调 = true;
            广告集成.显示视频广告();
        }
    }
    public void 继续游戏(int 奖励点数)
    {
        //Firebase.Analytics.FirebaseAnalytics.LogEvent("Game_Event", "GameOver_reLive", 1.0f);

        广告集成.m_当前广告集成.关闭底部广告();
        地图管理器.m_当前地图管理器.m_续命按钮.SetActive(false);
        地图管理器.m_当前地图管理器.m_统计面板.SetActive(false);
        if (m_致死方块 != null)
        {
            m_致死方块.transform.position = new Vector3(1000,1000,1000);
            DestroyObject(m_致死方块);
            m_致死方块 = null;
        }
        增加几个(奖励点数);
        失败 = false;
    }
    public void 重新开始(bool 直接开完)
    {
        广告集成.m_当前广告集成.关闭底部广告();
        地图管理器.m_当前地图管理器.清空地图();
        场景管理器.m_当前场景管理器.卸载场景(this.gameObject.scene);
        场景管理器.m_当前场景管理器.加载场景("游戏主场景");
        RenderSettings.fog = false;

        游戏全局.直接开玩 = 直接开完;
    }

    public void 增加几个(int 几)
    {
        Vector3 m_头部的最新位置 = m_头部.transform.position;


        for (int i = 0; i < 几; i++)
        {
            m_历史位置.Enqueue(m_头部的最新位置);
            玩家点 tmp = Instantiate<玩家点>(m_玩家小段预制);
            tmp.transform.parent = this.transform;
            tmp.m_所属玩家控制 = this;
            m_小球列表.Add(tmp.gameObject);
        }

        var tmpa = Instantiate(m_接东西音效[Random.Range(0, 5)]);
        DestroyObject(tmpa, 3);
    }

    float 音量增减时长 = 10;
    float 当前音量 = 25 * 10;
    float 音量趋势 = 0;
    public void 控制音量()
    {
        float 音量start = 25 * 音量增减时长;
        float 音量MAX = 50* 音量增减时长;
        float 音量MIN = 4 * 音量增减时长;
        if (失败)
        {
            if (当前音量 < 音量start)
            {
                音量趋势 = 2;
                当前音量 = 当前音量 + 音量趋势;
                m_背景音乐.volume = 当前音量 / 音量MAX;
            }
            else if( 当前音量 >= 音量start)
            {
                当前音量 = 音量start;
                m_背景音乐.volume = 当前音量 / 音量MAX;
            }
        } 
        else if (!失败 && 地图管理器.m_当前地图管理器.m_玩家当前所在行 > 10)
        {
            if (m_小球列表.Count < 7 && 当前音量 == 音量start)
            {
                音量趋势 = -1;
                Debug.Log("音量趋势调整" + 音量趋势);
            }
            else if (m_小球列表.Count > 20 && 当前音量 == 音量MIN)
            {
                音量趋势 =  2;
                Debug.Log("音量趋势调整" + 音量趋势);
            }
            当前音量 = 当前音量 + 音量趋势;
            当前音量 = 当前音量 < 音量MIN ? 音量MIN : 当前音量;
            当前音量 = 当前音量 > 音量start ? 音量start : 当前音量;
            m_背景音乐.volume = 当前音量 / 音量MAX;
        }

    }

}
